home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWSemEvt / FWScpCal.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  8.8 KB  |  269 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWScpCal.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #ifndef FWSCPCAL_H
  11. #include "FWScpCal.h"
  12. #endif
  13.  
  14. //========================================================================================
  15. //    Template Instantiations
  16. //========================================================================================
  17.  
  18. #ifdef FW_USE_TEMPLATE_PRAGMAS
  19.  
  20. #pragma template_access public
  21.  
  22. #pragma template FW_TMap<ODDescType, FWDescCoerceFunc>
  23. #pragma template FW_TPair<ODDescType, FWDescCoerceFunc>
  24.  
  25. #pragma template FW_TMap<ODDescType, FWDescComparisonFunc>
  26. #pragma template FW_TPair<ODDescType, FWDescComparisonFunc>
  27.  
  28. #pragma template FW_TPrivDestroyer<FW_CDescCoercionCallbacks>
  29. #pragma template FW_TPrivDestroyer<FW_CDescComparisonCallbacks>
  30.  
  31. #elif defined (__SC__)
  32.  
  33. template class FW_TPrivDestroyer<FW_CDescCoercionCallbacks>;
  34. template class FW_TPrivDestroyer<FW_CDescComparisonCallbacks>;
  35.  
  36. #endif
  37.  
  38. //========================================================================================
  39. //    Static Allocations
  40. //========================================================================================
  41.  
  42. FW_CDescCoercionCallbacks* FW_CDescCoercionCallbacks::fgInstance;
  43. FW_TPrivDestroyer<FW_CDescCoercionCallbacks> FW_CDescCoercionCallbacks::fgDestroyer;
  44.  
  45. FW_CDescComparisonCallbacks* FW_CDescComparisonCallbacks::fgInstance;
  46. FW_TPrivDestroyer<FW_CDescComparisonCallbacks> FW_CDescComparisonCallbacks::fgDestroyer;
  47.  
  48. //========================================================================================
  49. //    Key Comparison Procs
  50. //========================================================================================
  51.  
  52. //----------------------------------------------------------------------------------------
  53. //    FW_PrivCompareCoercionPairs
  54. //----------------------------------------------------------------------------------------
  55.  
  56. static int FW_PrivCompareCoercionPairs(void* p1, void* p2)
  57. {
  58.     const ODDescType key1 = ((FW_CPrivDescTypeToCoercionPair*)p1)->fKey;
  59.     const ODDescType key2 = ((FW_CPrivDescTypeToCoercionPair*)p2)->fKey;
  60.     
  61.     if (key1 == key2)
  62.         return 0;
  63.     else if (key1 > key2)
  64.         return 1;
  65.     else
  66.         return -1;
  67. }
  68.  
  69. //----------------------------------------------------------------------------------------
  70. //    FW_PrivCompareComparisonPairs
  71. //----------------------------------------------------------------------------------------
  72.  
  73. static int FW_PrivCompareComparisonPairs(void* p1, void* p2)
  74. {
  75.     const ODDescType key1 = ((FW_CPrivDescTypeToComparisonPair*)p1)->fKey;
  76.     const ODDescType key2 = ((FW_CPrivDescTypeToComparisonPair*)p2)->fKey;
  77.     
  78.     if (key1 == key2)
  79.         return 0;
  80.     else if (key1 > key2)
  81.         return 1;
  82.     else
  83.         return -1;
  84. }
  85.  
  86. //========================================================================================
  87. //    class FW_CDescCoercionCallbacks
  88. //========================================================================================
  89.  
  90. //----------------------------------------------------------------------------------------
  91. //    FW_CDescCoercionCallbacks::FW_CDescCoercionCallbacks
  92. //----------------------------------------------------------------------------------------
  93.  
  94. FW_CDescCoercionCallbacks::FW_CDescCoercionCallbacks() :
  95.     fMap(FW_PrivCompareCoercionPairs)
  96. {
  97. }
  98.  
  99. //----------------------------------------------------------------------------------------
  100. //    FW_CDescCoercionCallbacks::~FW_CDescCoercionCallbacks
  101. //----------------------------------------------------------------------------------------
  102.  
  103. FW_CDescCoercionCallbacks::~FW_CDescCoercionCallbacks()
  104. {
  105.     fgInstance = NULL;
  106. }
  107.  
  108. //----------------------------------------------------------------------------------------
  109. //    FW_CDescCoercionCallbacks::RegisterHandler
  110. //----------------------------------------------------------------------------------------
  111.  
  112. void FW_CDescCoercionCallbacks::RegisterHandler(ODDescType toType,
  113.                                                 FWDescCoerceFunc func)
  114. {
  115.     FW_CDescCoercionCallbacks* callbacks = Instance(TRUE);
  116.     FW_ASSERT(!callbacks->fMap.Find(toType));
  117.     callbacks->fMap.Add(toType, func);
  118. }
  119.  
  120. //----------------------------------------------------------------------------------------
  121. //    FW_CDescCoercionCallbacks::RemoveHandler
  122. //----------------------------------------------------------------------------------------
  123.  
  124. void FW_CDescCoercionCallbacks::RemoveHandler(ODDescType toType)
  125. {
  126.     FW_CDescCoercionCallbacks* callbacks = Instance(FALSE);
  127.     if (!callbacks)
  128.         FW_Failure(FW_xBadRemove);
  129.     
  130.     callbacks->fMap.Remove(toType);
  131. }
  132.  
  133. //----------------------------------------------------------------------------------------
  134. //    FW_CDescCoercionCallbacks::InvokeHandler
  135. //----------------------------------------------------------------------------------------
  136.  
  137. FW_Handled FW_CDescCoercionCallbacks::InvokeHandler(const FW_CDesc& sourceDesc,
  138.                                                     ODDescType toType,
  139.                                                     FW_CDesc& coercedDesc)
  140. {
  141.     FW_Handled handled = FW_kNotHandled;
  142.     FW_CDescCoercionCallbacks* callbacks = Instance(FALSE);
  143.     
  144.     if (callbacks)
  145.     {
  146.         FW_TRY
  147.         {
  148.             FW_CPrivDescTypeToCoercionPair* pair = callbacks->fMap.Find(toType);
  149.             if (pair)
  150.             {
  151.                 handled = pair->fValue(sourceDesc, toType, coercedDesc);
  152.             }
  153.         }
  154.         FW_CATCH_BEGIN
  155.         FW_CATCH_EVERYTHING()
  156.         {
  157.         }
  158.         FW_CATCH_END
  159.     }
  160.     return handled;
  161.  
  162. }
  163.  
  164. //----------------------------------------------------------------------------------------
  165. //    FW_CDescCoercionCallbacks::Instance
  166. //----------------------------------------------------------------------------------------
  167.  
  168. FW_CDescCoercionCallbacks* FW_CDescCoercionCallbacks::Instance(FW_Boolean create)
  169. {
  170.     if (!fgInstance && create)
  171.     {
  172.         fgInstance = new FW_CDescCoercionCallbacks;
  173.         fgDestroyer.SetDoomed(fgInstance);
  174.     }
  175.     return fgInstance;
  176. }
  177.  
  178. //========================================================================================
  179. //    class FW_CDescComparisonCallbacks
  180. //========================================================================================
  181.  
  182. //----------------------------------------------------------------------------------------
  183. //    FW_CDescComparisonCallbacks::FW_CDescComparisonCallbacks
  184. //----------------------------------------------------------------------------------------
  185.  
  186. FW_CDescComparisonCallbacks::FW_CDescComparisonCallbacks() :
  187.     fMap(FW_PrivCompareComparisonPairs)
  188. {
  189. }
  190.  
  191. //----------------------------------------------------------------------------------------
  192. //    FW_CDescComparisonCallbacks::~FW_CDescComparisonCallbacks
  193. //----------------------------------------------------------------------------------------
  194.  
  195. FW_CDescComparisonCallbacks::~FW_CDescComparisonCallbacks()
  196. {
  197.     fgInstance = NULL;
  198. }
  199.  
  200. //----------------------------------------------------------------------------------------
  201. //    FW_CDescComparisonCallbacks::RegisterHandler
  202. //----------------------------------------------------------------------------------------
  203.  
  204. void FW_CDescComparisonCallbacks::RegisterHandler(ODDescType compareType,
  205.                                                 FWDescComparisonFunc func)
  206. {
  207.     FW_CDescComparisonCallbacks* callbacks = Instance(TRUE);
  208.     FW_ASSERT(!callbacks->fMap.Find(compareType));
  209.     callbacks->fMap.Add(compareType, func);
  210. }
  211.  
  212. //----------------------------------------------------------------------------------------
  213. //    FW_CDescComparisonCallbacks::RemoveHandler
  214. //----------------------------------------------------------------------------------------
  215.  
  216. void FW_CDescComparisonCallbacks::RemoveHandler(ODDescType comparisonOperator)
  217. {
  218.     FW_CDescComparisonCallbacks* callbacks = Instance(FALSE);
  219.     if (!callbacks)
  220.         FW_Failure(FW_xBadRemove);
  221.     
  222.     callbacks->fMap.Remove(comparisonOperator);
  223. }
  224.  
  225. //----------------------------------------------------------------------------------------
  226. //    FW_CDescComparisonCallbacks::InvokeHandler
  227. //----------------------------------------------------------------------------------------
  228.  
  229. FW_Handled FW_CDescComparisonCallbacks::InvokeHandler(ODDescType comparisonOperator,
  230.                                                     const FW_CDesc& lhDesc,
  231.                                                     const FW_CDesc& rhDesc,
  232.                                                     FW_Boolean& result)
  233. {
  234.     FW_Handled handled = FW_kNotHandled;
  235.     FW_CDescComparisonCallbacks* callbacks = Instance(FALSE);
  236.     
  237.     if (callbacks)
  238.     {
  239.         FW_TRY
  240.         {
  241.             FW_CPrivDescTypeToComparisonPair* pair = callbacks->fMap.Find(comparisonOperator);
  242.             if (pair)
  243.             {
  244.                 handled = pair->fValue(comparisonOperator, lhDesc, rhDesc, result);
  245.             }
  246.         }
  247.         FW_CATCH_BEGIN
  248.         FW_CATCH_EVERYTHING()
  249.         {
  250.         }
  251.         FW_CATCH_END
  252.     }
  253.     return handled;
  254. }
  255.  
  256. //----------------------------------------------------------------------------------------
  257. //    FW_CDescCoercionCallbacks::Instance
  258. //----------------------------------------------------------------------------------------
  259.  
  260. FW_CDescComparisonCallbacks* FW_CDescComparisonCallbacks::Instance(FW_Boolean create)
  261. {
  262.     if (!fgInstance && create)
  263.     {
  264.         fgInstance = new FW_CDescComparisonCallbacks;
  265.         fgDestroyer.SetDoomed(fgInstance);
  266.     }
  267.     return fgInstance;
  268. }
  269.